package com.learning.demos.jvmgc;

/**
 * @author adolphw
 *
 * 如何查看正在运行的java程序所运行的参数
 * jps
 * jinfo
 *
 *  jinfo -flag PrintGCDetails 26180
 *
 *  jinfo -flag MetaSpaceSize 4300
 *  jinfo -flag MaxTenuringThreshold 线程号
 *  jinfo -flags 3333
 *
 *  comand line 手动加的jvm参数
 *
 *  -Xms：等价于-XX:InitialHeapSize
 *  -Xmx：等价于-XX:MaxHeapSize
 *  -Xss：等价于-XX:ThreadStackSize
 *
 *  java -XX:+PrintFlagInitial
 *  java -XX:+PrintFlagsFinal  =没改过 :=修改过
 *  java -XX:PrintComandLienFlags
 *
 *  -Xms 初始大小内存，默认为物理内存的1/64
 *  -Xmx 最大分配内存，默认为物理内存1/4
 *  -Xss 设置单个线程栈的大小，一般默认为512k～1024k
 *  -Xmn 设置年代大小
 *
 *  -XX:MetaspaceSize 设置元空间大小:原空间的本质和永久代类似，都是jvm规范中方法区的实现，不过元空间与永久代之间的最大区别在于：
 *  元空间并不在虚拟机中，而是使用本地内存，因此，默认情况下，元空间的大小仅售本地内存限制
 *
 *  XX:+PrintGCDetail
 *  XX:survivorRatio 设置新生代中eden和s0/s1空间比例  -XX:SurvivorRatio=8,Eden:S0/S1=8:1:1
 *  -XX:NewRatio=2 新生代占1，老年代占2，年轻代占整个堆的1/3 ；设置老年代的占比，剩下的1给新生代
 *  -XX:MaxTenuringThreshold 设置垃圾最大年龄
 *
 * 4种主要垃圾收集器：
 * 串行：会暂停用户线程，-XX:+UseSerialGC
 * 并行：适用于大数据计算，也会暂停用户程序去清除数据 UseParallelGC
 * 并发：不会停止用户程序，适用于互联网强交互 CMS(UserConcMarkSweep)
 * G1：G first，堆内存分区进行并发垃圾回收
 *
 * java8 默认并行垃圾回收器
 *
 * -XX:+UsePaParallelGC
 *
 *
 * cms：优点：并发收集低停顿；缺点：由于并发进行，cms在收集与应用线程会同时增加对堆内存的占用，也就是说，cms必须要在老年代堆内存用尽之前完成垃圾回收，否则
 * cms回收失败时，将触发担保机制，串行老年代收集器将会以stw的方式进行一次GC，从而造成较大的停顿时间，占用CPU比较大；产生较多碎片
 *
 * 单cpu或者小内存，单机程序
 * -XX:+UseSerialGC
 * 多cpu，需要最大吞吐量，如后台计算型应用
 * -XX:+UseParallelGC 或者
 * -XX:UseParallelOldGC
 * 多cpu，追求低停顿时间，需快速响应如互联网应用
 * -xx:+UseConcMarkSweepGC
 *
 * -XX:+UseG1GC
 * 横跨个新生代老年代
 * garbage-first heap
 * metaspace
 *
 * -XX:+UseG1GC -Xmx32G -XX:MaxGCPauseMillis=100
 *
 */
public class HelloGC {
    public static void main(String[] args) throws InterruptedException {
        System.out.println("**************hello gc");

        long totalMemory = Runtime.getRuntime().totalMemory();


        Thread.sleep(Integer.MAX_VALUE);


    }
}
